// 2024年5月10日 完成了 对menu.c、menu.h、u_Oled.c程序的优化，使用代码更简洁

#include "User_App.h"
#include "u_Time.h"
#include "u_Key.h"
#include "OLED.h"
#include "u_Oled.h"
#include "menu.h"
#include "bsp_PWM.h"
#include "u_Beep.h"
#include "bsp_ADC.h"
#include "Flash_Eeprom.h"

mcu_info_t info = {
    .m_Set_Heat_Tim = 180,
    .m_Set_Water_Value = 50,
};

// 软定时器
bsp_TIM_t Ti_RUN_LED; // 运行指示灯
bsp_TIM_t Ti_GET_CO;  // 定时获取 执行板 数据
bsp_TIM_t Ti_ADC;
bsp_TIM_t Ti_ADC_DATA;

// float Vmcu_Value; // MCU供电电压

// extern Menu_t MenuVII_WaterSet[];
extern Menu_t MenuVI_Chief[];
extern Menu_t MenuVII_Heat[];
extern Menu_t MenuVII_Debug[];

void Flash_Init(void);

void User_App(void)
{
#if 0

  OLED_Menu_Debug();
  // KEY_Debug();
  // bsp_Ti_Debug();
  // bsp_PWM_Debug();
  // bsp_Adc_Debug();
  // Flash_Debug();

#else

  OLED_Init();
  Beep_Init();
  Flash_Init();
  bsp_Adc_Init(&ADC_OBEY);

  Ti_obj_New(&Ti_RUN_LED, 500, Ti_RUN, Ti_RUN_LED_event);
  Ti_obj_New(&Ti_GET_CO, 1000, Ti_RUN, Ti_GET_CO_event);

  Ti_obj_New(&Ti_ADC, 20, Ti_RUN, Ti_ADC_Function);
  Ti_obj_New(&Ti_ADC_DATA, 20 * ADC_OBJ_DATA_NUM, Ti_RUN, Ti_ADC_DATA_Function);

  SetRunList = MenuVI_Chief; // 运行界面设置成设置界面
                             // MenuVII_WaterSet[1].Data = 50; // 设置倒计时数据

  MenuVII_Heat[1].Data = info.m_Set_Heat_Tim;     // 水温设定
  MenuVII_Heat[2].Data = info.m_Set_Water_Value;  // 设定水量
  MenuVII_Debug[3].Data = info.m_Set_Water_Value; // 水壶
  MenuVII_Debug[4].Data = info.m_SpillFlag;       // 水溢

  // Beep_Sound(5);

  while (1)
  {
    bsp_Ti_All_Handle();
    KEY_All_event_Handle();
    OLED_Menu_Handle();
  }
#endif
}

void LED_Run_Debug(void)
{
  while (1)
  {
    LED_RUN_TOGG;
    LL_mDelay(500);
  }
}
void Flash_Init(void)
{
  if (FLASH_EEPROM_Read(FLASH_HEAT_TIM_ADDR) == 0xFFFFFFFFFFFFFFFF)
  {
    FLASH_EEPROM_Write(FLASH_HEAT_TIM_ADDR, 180);
    FLASH_EEPROM_Write(FLASH_WATER_VALUE_ADDR, 50);
  }
  else
  {
    info.m_Set_Heat_Tim = FLASH_EEPROM_Read(FLASH_HEAT_TIM_ADDR);
    info.m_Set_Water_Value = FLASH_EEPROM_Read(FLASH_WATER_VALUE_ADDR);
  }
}

// 电池电量处理
void Battery_mV(void)
{
    uint8_t mV_Fill = 0;
    OLED_ShowImage(104, 0, 24, 16, BatteryCharge_24x16); // 显示充电边框
    // info.m_Vref_mV = 3400;//调试用
    if (info.m_Vref_mV <= 4200)
        mV_Fill = 18;
    if (info.m_Vref_mV < 3960)
        mV_Fill = 14;
    if (info.m_Vref_mV < 3720)
        mV_Fill = 10;
    if (info.m_Vref_mV < 3480)
        mV_Fill = 6;
    if (info.m_Vref_mV < 3240)
        mV_Fill = 2;
    if (info.m_Vref_mV <= 3000)
        mV_Fill = 0;
    OLED_DrawRectangle(106, 4, mV_Fill, 8, OLED_FILLED);
}
